条件処理・繰り返し


条件処理( If Then Else )
If
ステートメントは、条件によって処理を選択する場合に使用します。If
ステートメントの書式は、条件の数によって下記の種類があります。
[ 書式 1 ]
If 条件 Then
条件が成立した場合の処理
End If
[ 書式 2 ]
If 条件 Then
条件が成立した場合の処理
Else
条件が成立しなかった場合の処理
End If
[ 書式 3 ]
If 条件 1 Then
条件 1 が成立した場合の処理
ElseIf 条件 2 Then
条件 2 が成立した場合の処理
(ElseIf の繰り返しが可能です。条件が 3
つ以上あるときは、ElseIf 条件 3、ElseIf 条件 4 ・・・
のように、必要なだけ条件処理を行います。)
Else
すべての条件が成立しなかった場合の処理
End If


処理内容:If Then 文の基本形
Sub If_1()
MyData = InputBox("数値を入力")
If MyData >= 50 Then
Msgbox "入力値は 50 以上でした"
End If
End Sub
処理内容:If Then 文の省略形
Sub If_2()
MyData = InputBox("数値を入力")
If MyData >= 50 Then Msgbox "入力値は 50 以上でした"
End Sub
処理内容:If Then Else 文の基本形
Sub If_3()
MyData = InputBox("数値を入力")
If MyData >= 50 Then
Msgbox "入力値は 50 以上でした"
Else
Msgbox "入力値は 50 未満でした"
End If
End Sub
処理内容:If Then Else 文の省略形
Sub If_4()
MyData = InputBox("数値を入力")
If MyData >= 50 Then MsgBox "入力値は 50 以上でした" _
Else: MsgBox "入力値は 50 未満でした"
End Sub
処理内容:If ElseIf Else 文
Sub If_5()
MyData = InputBox("数値を入力")
If MyData >= 80 Then
MsgBox "優"
ElseIf MyData >= 60 Then
MsgBox "良"
Else
MsgBox "可"
End If
End Sub
処理内容:If ElseIf Else 文 ( MsgBox の戻り値による条件分岐 )
Sub If_6()
Msg = "ボタンをクリックしてください。"
Style = vbYesNoCancel + vbQuestion + vbDefaultButton1
Title = " If ステートメントの練習"
Msg_Ret = MsgBox(Msg, Style, Title)
If Msg_Ret = vbYes Then
MsgBox "「はい」が選択されました"
ElseIf Msg_Ret = vbNo Then
MsgBox "「いいえ」が選択されました"
Else
MsgBox "「キャンセル」が選択されました"
End If
End Sub
処理内容:If 文のネスト(条件の中に更に条件を設定する)
Sub If_7()
km = 80:kg = 15
If km < 100 Then
If kg < 10 Then
MsgBox "基本料金"
End If
MsgBox "超過料金"
Else
MsgBox "超過料金"
End If
End Sub


条件処理( Select Case )
Select Case
ステートメントは、選択しが沢山あるときにざのような処理を行うかを決めるときに利用しやすい命令で、変数の値の内容によって処理分岐を行うような場合に使用します。
Select Case ステートメントの書式は、下記のとおりです。
Select Case <任意の数式または文字列>
Case <数式または文字列 1 >
<数式または文字列 1> のときの処理
Case <数式または文字列 n>
<数式または文字列 n> のときの処理
Case Else
上記の<数式または文字列 1 〜 n > どの Case
にも一致しないときの処理(省略可)
End Select
Select Case
文に指定する「任意の数式または文字列」には、一般的に、計算式、セル参照または変数を用います。
Case 文に指定する「数式または文字列」には、計算式の結果で得られる値、参照したセルの値、変数に代入される値などを指定します。指定する「値」には、下表のように、1
つだけの値のほか、複数の値、一定範囲を示す値を指定することができます。
値の内容 |
指 定 方 法 |
単独の値 |
数式または文字列
を指定します
例1: Case 5
例2: Case "名古屋" |
複数の値 |
数式または文字列 を「 , (カンマ)」で区切って指定します
例1: Case 1,3,5
例2: Case "東","西" |
一定範囲の値 |
〜 To 〜 |
値の上限と下限を指定します
例1: Case 5 To 10
例2: Case "A" To "E" |
Is 演算子 〜 |
演算子を使用して値を指定します
例1: Case Is >= 10
例2: Case Is >0 And Num <= 10 |
複数値と一定範囲の併用 |
複数の値と一定範囲の値を併用して指定します
例1: Case 1,3,5 To 8,10,12
例2: Case 10 To 20,Is > MaxNum |
たとえば、変数「Num」に 1 〜 3
までのいずれかの数値が代入される可能性がある場合に、代入された値によって処理内容を選択したいときには次のように指定します。
Select Case Num
Case 1
< Num の値が 1 のときの処理>
Case 2
< Num の値が 2 のときの処理>
Case 3
< Num の値が 3 のときの処理>
Case Else
< Num の値が 1 〜 3 以外の値のときの処理>
End Select


処理内容:入力データが偶数・奇数により処理分岐
Sub SelectCase_1()
IntN =Val( InputBox("1 〜 9 の数字を入力してください。"))
Select Case IntN
Case 1, 3, 5, 7, 9
MsgBox "入力値 " & IntN & " は奇数です。"
Case 2, 4, 6, 8
MsgBox "入力値 " & IntN & " は偶数です。"
End Select
End Sub
処理内容:入力データが偶数・奇数により処理分岐(計算結果による分岐)
Sub SelectCase_2()
IntN =Val( InputBox("1 〜 9 の数字を入力してください。"))
Select Case IntN Mod 2
Case 1
MsgBox "入力値 " & IntN & " は奇数です。"
Case 0
MsgBox "入力値 " & IntN & " は偶数です。"
End Select
End Sub
処理内容:入力データが一定範囲にあるとき処理分岐
Sub SelectCase_3()
IntN =Val( InputBox("2桁の数字を入力してください。"))
Select Case IntN
Case 1 To 50
MsgBox "入力値" & IntN & "は 50 以下です。"
Case 51 To 99
MsgBox "入力値" & IntN & "は 51 以上です。"
End Select
End Sub
処理内容:入力データが一定範囲にあるとき処理分岐(演算子で指定 )
Sub SelectCase_4()
IntN = Val(InputBox("2桁の数値を入力してください。"))
Select Case IntN
Case Is < 51
MsgBox " 式の意味 51未満"
Case Is >= 51 And IntN <= 70
MsgBox " 式の意味 51以上、かつ、70以下"
Case Is > 70
MsgBox " 式の意味 70を超える"
End Select
End Sub
処理内容:入力データが文字列定数のときの処理分岐
Sub SelectCase_5()
NameStr=InputBox("方角を漢字で入力してください。")
Select Case NameStr
Case "東", "西"
MsgBox NameStr & vbCrLf & "方向 = East 又は West"
Case "南", "北"
MsgBox NameStr & vbCrLf & "方向 = South 又は North"
End Select
End Sub
処理内容:入力データが数値定数のときの処理分岐
Sub SelectCase_6()
Gengou = Val(InputBox("元号番号を入力「1.明治、2.大正、3.昭和、4.平成」"))
Select Case Gengou
Case 1: strNen = "明治": Y = Y + 1866 '元号の値が1のときの処理
Case 2: strNen = "大正": Y = Y + 1911 '元号の値が2のときの処理
Case 3: strNen = "昭和": Y = Y + 1925 '元号の値が3のときの処理
Case 4: strNen = "平成": Y = Y + 1988 '元号の値が4のときの処理
End Select
MsgBox strNen & "元年は西暦" & Y & "年"
End Sub
処理内容:Select Case のネストによる処理分岐
Sub SelectCase_7()
A=10:B=5
Select Case A
Case Is >= 5
Select Case B
Case Is < 5
MsgBox "A は 5 以上で B は 5 未満"
Case Is >= 5
MsgBox "A は 5 以上で B は 5 以上"
End Select
Case Is < 5
MsgBox "A は 5 未満"
End Select
End Sub


繰り返し処理( For 〜 Next )
For 〜 Next
ステートメントは、ある処理を指定回数分繰返すときに使用します。具体的には、変数(繰り返しカウンタ)の値を初期値から増分値(初期値に加える数)で指定した間隔で変化させながら終了値にいたるまでの間、繰返す処理を実行する命令です。
For 〜 Next ステートメントの書式は次のとおりです。
For <変数> = <初期値> To <終了値> Step <増分値>
繰返す処理
Next <変数>
増分値が 1 のときは Step
以下を省略することができます。
For 〜 Next の中にさらに For 〜 Next
を組み込んで使用することもできます。これを「For Next
のネスト」といいます。下記の例では、掛け算の九九計算を行います。
For I = 1 To 9
For J = 1 To 9
Cells(I,J) = I*J
Next J
Next I
For 〜 Next
の処理の途中で、条件判断の結果により繰り返し処理を抜け出るには、If
文を組み合わせ、条件を満たした場合に「Exit For」ステートメントを実行させます。
For I = 1 To 9
何らかの処理
If <条件> Then '
条件を満たしたときにループを抜けて「次の処理」へ移ります。
Exit For
End If
何らかの処理
Next I
次の処理


処理内容:For 〜 Next 文の基本( 増分値指定型 )
Sub ForNext_1()
Total = 0
For I = 1 To 10 Step 1
Total = Total + I
Next I
MsgBox Total
End Sub
処理内容:For 〜 Next 文( 増分値省略型 )
Sub ForNext_2()
Total = 0
For I = 1 To 10
Total = Total + I
Next I
MsgBox Total
End Sub
処理内容:奇数行のみ加算
Sub ForNext_3()
Total = 0
For R =1 To 10 Step 2
Total = Total+Cells(R,1)
Next R
MsgBox Total
End Sub
処理内容:偶数行のみ加算
Sub ForNext_4()
Total = 0
For R =2 To 10 Step 2
Total = Total+Cells(R,1)
Next R
MsgBox Total
End Sub
処理内容:A列の先頭行から最終行まで加算
Sub ForNext_5()
最上行番号 = Range("A1").CurrentRegion.Row
最下行番号 = Cells(ActiveSheet.Rows.Count, 1).End(xlUp).Row
Total = 0
For R = 最上行番号 To 最下行番号
Total = Total + Cells(R, 1).Value
Next R
MsgBox Total
End Sub
処理内容:2行目の左端列から右端列まで加算
Sub ForNext_6()
左端列番号 = Range("A1").CurrentRegion.Column
右端列番号 = Cells(2,ActiveSheet.Columns.Count).End(xlToleft).Column
Total = 0
For C = 左端列番号 To 右端列番号
Total = Total + Cells(2,C).Value
Next C
MsgBox Total
End Sub
処理内容:For Next のネスト
Sub ForNext_7()
For C = 1 To 9
For R = 1 To 9
Cells(R,C).Value = C*R
Next R
Next C
End Sub
処理内容:A列のセルが空白のとき、行を削除する
Sub ForNext_8()
最下行番号 = Cells(ActiveSheet.Rows.Count, 1).End(xlUp).Row
For R = 最下行番号 To 1 Step -1
If Cells(R,1).Value = "" Then
Rows(R).Delete
End If
Next R
End Sub
処理内容:計算結果が偶数のときにループを抜け出す(計算結果判定)
Sub ForNext_9()
For I = 1 To 10
X = Int(Rnd * 100)
If X Mod 2 = 0 Then
MsgBox X & " は偶数なのでループを抜け出します "
Exit For
End If
MsgBox X & " は奇数なのでループを継続します "
Next I
End Sub


繰り返し処理( For Each 〜 Next )
For Each 〜 Next
ステートメントは、すべてのシートに処理を行ったり、シートの選択範囲のすべてに繰り返し同じ処理を行う場合などに利用します。For
Each 〜 Next
ステートメントでは繰り返し処理を行う対象であるコレクションに変数を指定し、その変数を介して、操作を行います。
For Each 〜 Next ステートメントの書式は次のとおりです。
For Each <変数> In <コレクション(Worksheet,Range など)>
繰返す処理
Next
For 〜 Next の中にさらに For Each 〜 Next
を組み込んで使用することもできます。これをネストといいます。
For Each 〜 Next
の処理の途中で、条件判断の結果により繰り返し処理を抜け出るには、If
文を組み合わせ、条件を満たした場合に「Exit For」ステートメントを実行させます。
For Each Rng In Range("A1").Currentregion
何らかの処理
If <条件> Then '
条件を満たしたときにループを抜けて「次の処理」へ移ります。
Exit For
End If
何らかの処理
Next
次の処理


|
For Each 〜 Next による繰り返し処理 |
処理内容:範囲の中から検索文字列を検索し、存在する場合は座標名を表示します
Sub ForEachNext_1()
Dim MyRange As Range
KeyWord = "検索文字列"
Application.ScreenUpdating = False
For Each MyRange In Range("A1").CurrentRegion
If MyRange.Value = KeyWord Then
Flag = 1
MsgBox "検索データの座標名は " & MyRange.Address & " です "
Exit For
End If
Next
Application.ScreenUpdating = True
If Flag = 0 Then
MsgBox "該当データなし"
End If
End Sub
処理内容:数値が入力されているセルの背景色を水色に設定します
Sub ForEachNext_1()
Dim MyRange As Range
Set MyRange = Cells(1, 1).CurrentRegion
For Each rng In MyRange
If IsNumeric(rng) = True Then
rng.Interior.ColorIndex = 8
End If
Next
Set MyRange = Nothing
End Sub
処理内容:セル結合が設定されているセルの結合を解除します
Sub ForEachNext_3()
For Each Cel In Range(Cells(1, 1), Range("A1").SpecialCells(xlLastCell))
If Cel.MergeCells = True Then
Cel.UnMerge
End If
DoEvents
Next
MsgBox "処理終了。"
End Sub
処理内容:ワークシートを検索して「Sheet1」というシートがあったらセルA1に「Test」を入力します
Sub ForEachNext_4()
For Each ws In Worksheets
If ws.Name = "Sheet1" Then
Range("A1").Value = "Test"
End If
Next
MsgBox "処理終了。"
End Sub


繰り返し処理( Do 〜 Loop )
Do 〜 Loop
ステートメントは、条件が満たされている間、または、条件が満たされるまで処理を繰り返し実行する命令です。
Do 〜 Loop
ステートメントの書式は、条件判断を処理の前にするか、処理の後でするかにより異なります。また、繰り返し方法も条件が「満たされている間(While)」「満たされるまで(Until)」の
2 通りあります。
処理の前に条件を設定すると、一度も処理が実行されない場合もありますし、処理の後に条件を設定すると必ず
1
度は処理を実行しますので、プログラム内容に応じて使い分けてください。
なお、条件は省略することができますが、その場合はループの中に繰り返し処理を抜け出る条件を設定する必要があります。これを指定しないと無限ループとなり、いつまでも処理を繰返します。
Do 〜 Loop ステートメントも、For 〜 Next
ステートメントと同じように、ループの中に Do 〜 Loop
ステートメントをネストすることができます。
繰り返し処理の途中でループを抜け出るときは、If
文と組み合わせて 「Exit Do」を使用します。
1 処理の前に条件判断をする
Do <While または Until> 条件式
繰返す処理
If <条件> Then '
条件を満たしたときにループを抜けて「次の処理」へ移ります。
Exit For
End If
繰返す処理
Loop
次の処理
2 処理の後で条件判断をする
Do
繰返す処理
If <条件> Then '
条件を満たしたときにループを抜けて「次の処理」へ移ります。
Exit For
End If
繰返す処理
Loop < While または Until > 条件式
次の処理


処理内容:条件式(個数を12で割った余りが 0 より大きい)を満たしている間繰り返します
Sub DoLoop_1()
Dim Kosuu As Integer
Kosuu = 40
Do While (Kosuu Mod 12) <> 0
Kosuu = Kosuu + 1
Loop
MsgBox "40以上12で割り切れる最小個数=" & Kosuu
End Sub
処理内容:条件式(乱数を加算した結果が100を超える)が満たされるまで繰返します
Sub DoLoop_2()
Dim I As Integer, X As Integer
Do Until X > 100
Randomize
X = X + Int(Rnd * 10)
I = I + 1
Loop
MsgBox "1 桁の乱数を加算して100を超えた加算回数= " & I & vbCrLf & vbCrLf & _
"加算結果 = " & X
End Sub
処理内容:条件式(入力年月日の曜日が水曜以外)を満たしている間繰り返します
Sub DoLoop_3()
Dim DateIn As Date
Do
DateIn = InputBox("年/月/日を入力してください。" & _
vbCrLf & vbCrLf & "水曜日のときプログラムが終了します。")
MsgBox Format(DateIn, "GGGE""年""M""月""D""日は""(AAAA)") & "です"
Loop While Application.WorksheetFunction.Weekday(DateIn) <> 4
End Sub
処理内容:条件式(入力年月日の曜日が土・日曜日以外)が満たされるまで繰返します
Sub DoLoop_4()
Dim DateIn As Date
Do
DateIn = InputBox("年/月/日を入力してください。" & _
vbCrLf & vbCrLf & "土・日曜日以外のときプログラムが終了します。")
MsgBox Format(DateIn, "西暦YYYY年M月D日(AAAA)") & "です"
Loop Until Application.WorksheetFunction.Weekday(DateIn, 2) < 6
End Sub

